package java8;

import tcp.socket.server1.User;

import java.util.Optional;

/**
 * @auther hanchao
 * @date 2017/4/6 13:29
 */
public class OptionalTest {
    public static void main(String[] args){
        Optional<Integer> optional = Optional.ofNullable(null);
        System.out.println(optional.isPresent());
        System.out.println(optional.orElse(13));

        //isPresent不是使用optional的正确方式
        //用了 isPresent() 处理 NullPointerException 不叫优雅, 有了  orElse, orElseGet 等, 特别是 map 方法才叫优雅.

        //一句话小结: 使用 Optional 时尽量不直接调用 Optional.get() 方法, Optional.isPresent() 更应该被视为一个私有方法,
        // 应依赖于其他像 Optional.orElse(), Optional.orElseGet(), Optional.map() 等这样的方法.
        //比如要实现groovy user?.getUsername()?.toUpperCase(); freemaker !这样的

        User p = new User("睡到","1:");//当然这个不一定有，也可能是null

        //我本人的观点是:  1. 当我们非常非常的明确将要传给 Optional.of(obj) 的 obj 参数不可能为 null 时,
        // 比如它是一个刚 new 出来的对象(Optional.of(new User(...))), 或者是一个非 null 常量时;
        // 2. 当想为 obj 断言不为 null 时, 即我们想在万一 obj 为 null 立即报告 NullPointException 异常, 立即修改, 而不是隐藏空指针异常时,
        // 我们就应该果断的用 Optional.of(obj) 来构造 Optional 实例, 而不让任何不可预计的 null 值有可乘之机隐身于 Optional 中.
        // 否则，用ofNullable

        Optional<User> user = Optional.ofNullable(null);

        //经过一系列运算，返回姓名了，返回姓名长度了什么的

        //下面这个，即使为null，也是安全不报错的
        user.map(x -> x.getName()).map(n -> n.length());
        //如果要返回，那么可以

        user.map(x -> x.getName()).map(n -> n.length()).orElse(null); //ok


    }
}
